package pe.edu.upc.dsd.jjjar.upcbank.server.controller;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSession;

import org.apache.axis.AxisFault;
import org.gwtwidgets.server.spring.GWTSpringController;
import pe.edu.upc.dsd.jjjar.afiliacion.AfiliarServiceProxy;
import pe.edu.upc.dsd.jjjar.afiliacion.Cliente;
import pe.edu.upc.dsd.jjjar.afiliacion.Constantes;
import pe.edu.upc.dsd.jjjar.afiliacion.ListadoResponse;
import pe.edu.upc.dsd.jjjar.afiliacion.OperacionResponse;
import pe.edu.upc.dsd.jjjar.upcbank.client.AfiliacionService;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.model.Afiliacion;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.model.Cuenta;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.model.Operation;
import pe.edu.upc.dsd.jjjar.upcbank.resources.client.model.UserProfile;
import pe.edu.upc.dsd.jjjar.upcbank.server.dao.AfiliacionDAO;
import pe.edu.upc.dsd.jjjar.upcbank.server.dao.CuentaDAO;
import pe.edu.upc.dsd.jjjar.upcbank.server.transport.Result;

import com.extjs.gxt.ui.client.data.BaseListLoadResult;
import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.ListLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;

public class AfiliacionRPCController extends GWTSpringController implements AfiliacionService{

	private static final long serialVersionUID = 1L;
	protected AfiliacionDAO iafiliacion;
	protected CuentaDAO icuenta;

	public void setIafiliacion(AfiliacionDAO iafiliacion) {
		this.iafiliacion = iafiliacion;
	}
	
	public void setIcuenta(CuentaDAO icuenta) {
		this.icuenta = icuenta;
	}
	


	@Override
	public ListLoadResult<Cuenta> getCuentas() {
		List<Cuenta> cuentas = new ArrayList<Cuenta>();
		
		HttpSession sess = perThreadRequest.get().getSession();
		
		UserProfile user = (UserProfile)sess.getAttribute(sess.getId());
		
		if(user!=null){
			cuentas = icuenta.list(user);
		}
	
		return new BaseListLoadResult<Cuenta>(cuentas);
	}

	@Override
	public PagingLoadResult<Afiliacion> getAfiliaciones(PagingLoadConfig config) {
		List<Afiliacion> afiliaciones = new ArrayList<Afiliacion>();
		
		HttpSession sess = perThreadRequest.get().getSession();
		
		UserProfile user = (UserProfile)sess.getAttribute(sess.getId());
		
		int totalProperty = 0;

		if(user!=null){
			
			AfiliarServiceProxy afiliarService;
			try {
				List<Cuenta> cuentas = icuenta.list(user);
				afiliarService = new AfiliarServiceProxy();
				
				String[] arrayCuentas = new String[cuentas.size()];
				for(int i=0; i<arrayCuentas.length; i++){
					arrayCuentas[i] = cuentas.get(i).getNrocta();
				}
				
				ListadoResponse response = afiliarService.listar(arrayCuentas, Constantes.ID_BANCO);
				Cliente[] clientes = response.getCliente();
				if(clientes!=null){
					
					for(Cliente c : clientes){
						Afiliacion afiliacion = new Afiliacion();
						// Buscar cuenta
						for(Cuenta cuenta : cuentas){
							if(cuenta.getNrocta().equals(c.getNrocuenta())){
								
								System.out.println( cuenta.getMoneda() + " /" + cuenta.getMonto());
								
								afiliacion.setCuenta(cuenta);
								break;
							}
						}
						
						afiliacion.setNrocel(c.getNrocelular());
						afiliacion.setFrase(c.getContrasena());
						afiliaciones.add(afiliacion);
					}
					
					totalProperty = afiliaciones.size();
	
					
				}
				

			} catch (AxisFault e) {
				e.printStackTrace();
			} catch (RemoteException e) {
				e.printStackTrace();
			}
			
			
			
		}
		

	
		return new BasePagingLoadResult<Afiliacion>(afiliaciones, config.getOffset(), totalProperty);
	}

	@Override
	public Operation save(Afiliacion afiliacion) {
		HttpSession sess = perThreadRequest.get().getSession();
		
		UserProfile user = (UserProfile)sess.getAttribute(sess.getId());
		if(user==null){
			return Result.sendError("La sesi&oacute;n ha expirado, vuelva a iniciar sesi&oacute;n");
		}
		
		
		Operation result;
		
		AfiliarServiceProxy afiliarService;
		try {
			boolean correcto = false;
			afiliarService = new AfiliarServiceProxy();
			Cliente cliente = new Cliente();
			cliente.setIdbanco(1);
			cliente.setNrocelular(afiliacion.getNrocel().toString());
			cliente.setNrocuenta(afiliacion.getCuenta().getNrocta());
			cliente.setContrasena(afiliacion.getFrase());
			OperacionResponse response = afiliarService.registrar(cliente);
			correcto = response.isCorrecto();
			result = (correcto)?Result.sendSuccess(response.getMensaje()):Result.sendError(response.getMensaje());
		} catch (AxisFault e) {
			result = Result.sendError("Se produjo un error al realizar la afiliaci&oacute;n");
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
			result = Result.sendError("El servicio a Metropolitano no esta habilitado, intente en otro momento. Disculpe las molestias.");
		}
		
		return result;
			
	}

	@Override
	public Operation delete(Afiliacion afiliacion) {
		HttpSession sess = perThreadRequest.get().getSession();
		
		UserProfile session = (UserProfile)sess.getAttribute(sess.getId());
		if(session==null){
			return Result.sendError("La sesi&oacute;n ha expirado, vuelva a iniciar sesi&oacute;n");
		}
		
		Operation result;
		
		AfiliarServiceProxy afiliarService;
		try {
			boolean correcto = false;
			afiliarService = new AfiliarServiceProxy();
			OperacionResponse response = afiliarService.desafiliar(afiliacion.getNrocel());
			correcto = response.isCorrecto();
			result = (correcto)?Result.sendSuccess(response.getMensaje()):Result.sendError(response.getMensaje());
		} catch (AxisFault e) {
			result = Result.sendError("Se produjo un error al realizar la afiliaci&oacute;n");
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
			result = Result.sendError("El servicio a Metropolitano no esta habilitado, intente en otro momento. Disculpe las molestias.");
		}
		
		return result;
		
	}

}
